"""
封装：
- 核心：将属性和方法 “包装” 在类内部，通过控制访问权限（公开 / 私有）保护数据。
- 私有属性 / 方法：在属性或方法名前加 `__`（双下划线），只能在类内部访问。
"""
"""
public 直接命名的变量或方法（无下划线前缀），默认是公开的，
可以被类内部、子类、类外部任意访问
"""
class MyClassPublic:
    def __init__(self):
        self.public_var = "我是公开变量"

    def public_method(self):
        return "我是公开方法"

my_class_pub = MyClassPublic()
print(my_class_pub.public_var)
result = my_class_pub.public_method()
print(result)
"""
Protected:以 单下划线 _ 为前缀的变量或方法，约定为 “受保护” 成员，
意味着仅供类内部和子类访问，不建议类外部直接使用（但语法上不禁止访问）。
"""
class MyClassProtected:
    def __init__(self):
        self._protected_var = "我是受保护变量"

    def _protected_method(self):
        return "我是受保护方法"
my_class_pro = MyClassProtected()
print(my_class_pro.protected_var)
result = my_class_pro.protected_method()
print(result)

"""
private:以 双下划线 __ 为前缀的变量或方法，会被 Python 进行 “名称修饰（name mangling）” 处理，
使其在类外部难以直接访问（本质是将名称改为 _类名__成员名 的形式，增强封装性）。
"""
# class MyClassPrivate:
#     def __init__(self):
#         self.__private_var = "我是私有变量"
#
#     def __private_method(self):
#         return "我是私有方法"
#
#
# # 类外部访问尝试
# my_class_pri = MyClassPrivate()
# print(my_class_pri.__private_var)  # 直接访问会报错
# print(my_class_pri.____private_method())  # 直接访问会报错
#
# #不推荐方式
# # 强行访问私有变量（不推荐）
# print(my_class_pri._MyClassPrivate__private_var)
#
# # 强行调用私有方法（不推荐）
# print(my_class_pri._MyClassPrivate__private_method())